打包
打包
重新学,估计得直接从官方文档开始学了,TODO
Setuptools
Setuptools 是主流的 Python 打包工具,相当于 Java 的 Maven。
官方文档:Quickstart - setuptools 68.0.0.post20230720 documentation
三种配置文件:TODO
setup.py
作为作为一种配置机制,Setuptools 为 setup.py
文件提供了一流的支持,然而,强烈不建议将 setup.py
文件作为脚本运行 (例如 python setup.py sdist
),并且大多数命令行接口已经 (或将被) 弃用 (例如 python setup.py install
, python setup.py bdist wininst
)。
我们建议用户通过 pyproject.toml 或者 setup.cfg 以更具声明性的方式公开尽可能多的配置。并保持 setup.py
的最小化,只包含动态部分 (如果可以的话,甚至可以完全不使用 setup.py
)。
通过这篇文章了解为什么不建议使用
setup.py
文件:Why you shouldn’t invoke setup.py directly
Setuptools 不推荐使用 setup.py
,推荐使用 pyproject.toml
+python -m build
。但是很多博客内容仍然采用 setup.py
文件作为打包的配置文件,我们心里明白 setup.py
文件一种过时的打包配置方式即可,本片博客会全程学习如何通过 pyproject.toml
来配置打包的过程。
关于
toml
这种配置文件格式,请看《TOML 配置文件.md》
build 包
安装
pycharm 对 Setuptools 的支持
安装
安装 setuptools,一般默认就已经安装,我们只需要自己编写 setup.py
即可
pip install setuptools
编写 setup.py
打包
安装到本地
python setup.py install
该命令会将当前的 Python 应用安装到当前 Python 环境的”site-packages”目录下, 这样其他程序就可以像导入标准库一样导入该应用的代码了
有点像 Maven 的 mvn install
命令的效果,将打出的包安装到 Maven 的本地仓库,这样,本地的其他项目就可以通过 Maven 依赖导入这个包
上传到 Pypi
像 Maven 的 mvn deploy
命令
Pycharm 支持
Create and run setup.py | PyCharm Documentation
Pycharm 可以自动创建 setup.py
文件,还提供了工具来执行,但是没啥卵用
有没有什么办法,可以一键执行 setup.py
文件打包,可以把 pycharm 的操作设置快捷键,TODO
总结
其实这个流程真的很像 Maven 的生命周期,参考《Maven 听课笔记.docx》的 Maven 概述
小节
下载 build 模块:
然后下载 wheel 模块
This library is the reference implementation of the Python wheel packaging standard, as defined in PEP 427.
It has two different roles:
A setuptools extension for building wheels that provides the bdist_wheel setuptools command
A command line tool for working with wheel files
It should be noted that wheel is not intended to be used as a library, and as such there is no stable, public API.
参考教程:build 0.10.0,跟着这个教程来,基本上就没问题了,
我感觉比 Maven 简单多了,
默认使用模拟的隔离环境来打包,但是使用隔离环境的时候,无法下载依赖,所以我们一般不使用隔离环境,不使用隔离环境的时候,你本地就得把打包需要的依赖都下好,比如 wheel,还有项目本身需要的依赖
python -m build -n
打包的结果有两个,一般在 /dist
目录下,一个是源码包(以 .tar.gz
结尾),一个是二进制包(以 .whl
结尾)
通过 project.scripts
配置,我们可以在安装 Python 包之后,以可执行脚本的方式暴露一些功能出来,通过这个,我们
-
可以暴露出一些功能到命令行中,比如服务的状态查询等
-
可以直接将整个 Python 包的功能以命令行的方式提供,通过在调用脚本的时候传入参数,就可以做出功能多样的脚本命令。这样的话,我们在 Linux 系统或者 Window 系统写脚本,就不需要使用 Bash 或者 Powershell 了,直接用 Python 写即可,然后打包成 Python 包然后安装即可,这样就实现了跨平台的脚本编写,非常方便。Python 本身就是一种脚本语言。
这里有一个问题,这样的脚本的执行权限是什么样的?哪些用户可以执行,哪些不可以?
例子:GitHub - vinta/pangu.py: Paranoid text spacing in Python
相关博客:Python中, 使用setup.py和console_scripts参数创建安装包和shell命令_console_scripts python-CSDN博客
比如
配置
pyproject.toml
[project.scripts]
simple_set_up = "simple_set_up.run.run_app:cli"
simple_set_up
包下有 run_app.py
:
def print_hi(name):
# Use a breakpoint in the code line below to debug your script.
print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint.
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
print_hi('PyCharm')
# See PyCharm help at https://www.jetbrains.com/help/pycharm/
def cli():
print('invoke from cli')
print_hi('PyCharm')
打包之后,通过 pip install
安装,直接运行 simple_set_up
输出
$ simple_set_up
invoke from cli
Hi, PyCharm
打包之后怎么用?TODO,
在文章的的开头,我应该讲解一下如何使用 pip install
直接通过 pip install
直接安装 .tar.gz
或者 .whl
类似的其他的打包工具有 Poetry,但是不怎么流行,有两个重要的原因,一个是没必要,Setuptools 已经很好用了,另外就是会出现莫名其妙的问题,具体的讨论,在 why I will never use python-poetry - YouTube 中有所演示。
Python 的打包工具非常多,非常多,这是他们的对比
Packaging tools comparisons — Sinoroc KB
Python 的工具推荐:
Tool recommendations — Python Packaging User Guide
这里提到了 Poetry 和 setuptools 的区别,Poetry 的作用是自动管理项目依赖,setuptools 只是一个打包工具,这两个东西结合在一起,才是 Maven 的效果,还提到了 virtualenv,作用是隔离项目的依赖跟本地安装的 Python 中的依赖,
我感觉这三个东西都有学习的必要
在学习 virtualenv 之前,我要搞清楚了 Poetry 和 setuptools 的区别,TODO, https://bbc.github.io/cloudfit-public-docs/packaging/this_way_up.html
在 Pycharm 中继续看看相关的内容。TODO
现在我已经学习了如何通过 setuptools 打包,我也要学习 Poetry 来管理项目依赖,,